package cn.ycc1.reflection;

import org.junit.jupiter.api.Test;

import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author ycc
 * @date 2023/12/3
 */
public class Main {

    @Test
    public static void main(String[] args) throws IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException {
        Properties properties = new Properties();
        properties.load(new FileInputStream("C:\\home\\cc-repository\\cc-java\\reflection\\src\\main\\resources\\application.properties"));

        String classfullpath = properties.get("classfullpath").toString();
        String methodName = properties.get("method").toString();
//        System.out.println(classfullpath);
//        System.out.println(methodName);

        // 使用反射机制
        // (1) 加载类
        Class cls = Class.forName(classfullpath);

        // (2) 通过 cls得到加载的类， cn.ycc1.reflection.Cat的对象实例
//        Object o = cls.newInstance();
//        System.out.println("o的运行类型: "+o.getClass());
        Constructor<?> constructor = cls.getDeclaredConstructor();
//        constructor.setAccessible(true);
        Object o = constructor.newInstance();
//        System.out.println("创建的实例： " + instance);

        // (3) 通过cls得到你加载的类 方法名称 hi 在反射中可以把方法当作对象
        Method method1 = cls.getMethod(methodName);

        // (4) 通过method1 调用方法： 即通过方法对象来实现调用方法
        method1.invoke(o);
    }
}
